home *** CD-ROM | disk | FTP | other *** search
/ Collection of Tools & Utilities / Collection of Tools and Utilities.iso / asmutil / asm_n_z.zip / VIDEO.ASM < prev    next >
Assembly Source File  |  1986-04-07  |  20KB  |  448 lines

  1. ;-------------------------------------------------------------------------------
  2. ;
  3. ;    video.asm                                        created 5-11-85
  4. ;
  5. ;    VIDEO ROUTINES
  6. ;    (C) COPYRIGHT 1985 BY THOMAS D. WEBB
  7. ;
  8. ;    MODIFIED FOR MICROSOFT 'C' BY GREGORY ETCHELL            4-1-86
  9. ;
  10. ;    ALL RIGHTS RESERVED.
  11. ;    PERMISSION IS GRANTED FOR UNLIMITED PERSONAL, NON-COMMERCIAL USE ONLY.
  12. ;
  13. ;-------------------------------------------------------------------------------
  14. TITLE              VIDEO
  15.  
  16. _TEXT   SEGMENT  BYTE PUBLIC 'CODE'
  17. _TEXT   ENDS
  18.  
  19. CONST   SEGMENT  WORD PUBLIC 'CONST'
  20. CONST   ENDS
  21.  
  22. _BSS    SEGMENT  WORD PUBLIC 'BSS'
  23. _BSS    ENDS
  24.  
  25. _DATA   SEGMENT  WORD PUBLIC 'DATA'
  26. _DATA   ENDS
  27.  
  28. DGROUP  GROUP    CONST, _BSS, _DATA
  29.         ASSUME    CS: _TEXT, DS: DGROUP, SS: DGROUP, ES:DGROUP
  30.  
  31.  
  32. _BSS               SEGMENT
  33.  
  34. BUFFER_SIZE        EQU       2000D    ;THE VIDEO BUFFER SIZE IN WORDS
  35. NUM_BYTES_IN_ROW   EQU       80       ;NUMBER OF BYTES IN A ROW
  36. MONOCHROME_SEGADR  EQU       0B000H   ;ADDRESS OF MONOCHROME BUFFER
  37. GRAPHICS_SEGADR    EQU       0B800H   ;ADDRESS OF GRAPHICS BUFFER
  38.                    EVEN
  39. _BSS               ENDS
  40.  
  41. _TEXT              SEGMENT
  42.  
  43. ;-------------------------------------------------------------------------------
  44. ; CLEAR            (ROUTINE 1)
  45. ;      THIS ROUTINE CLEARS THE SCREEN
  46. ; THE C LANGUAGE CALL IS:
  47. ;      CLEAR();
  48. ; THE ASSEMBLY CALL IS:
  49. ;      CALL CLEAR
  50. ;-------------------------------------------------------------------------------
  51.                    PUBLIC    _clear
  52. _clear             PROC      NEAR
  53.                    PUSH      BP          ;THE FRAME POINTER
  54.                    MOV       AH,6        ;SCROLL ACTIVE PAGE UP
  55.                    MOV       AL,019H     ;CLEAR 25 LINES
  56.                    MOV       CX,0H       ;UPPER LEFT OF SCROLL
  57.                    MOV       DX,2479H    ;LOWER RIGHT OF SCROLL
  58.                    MOV       BH,7H       ;USE NORMAL ATTRIBUTE ON BLANKED LINE
  59.                    INT       10H         ;VIDEO-IO
  60.                    POP       BP          ;THE FRAME POINTER
  61.                    RET
  62. _clear             ENDP
  63.  
  64. ;-------------------------------------------------------------------------------
  65. ; LOCATE           (ROUTINE 2)
  66. ;        THIS ROUTINE WILL LOCATE THE CURSOR AT A ROW AND COLUMN ON THE SCREEN
  67. ; THE C LANGUAGE CALL IS:
  68. ;        LOCATE(ROW,COLUMN);è; THE ASSEMBLY CALL IS:
  69. ;        MOV    DX,COL     ;RANGE IS 0 - 79
  70. ;        PUSH   DX
  71. ;        MOV    DX,ROW     ;RANGE IS 0 - 24
  72. ;        PUSH   DX
  73. ;        CALL   LOCATE
  74. ;-------------------------------------------------------------------------------
  75.                    PUBLIC    _locate
  76. _locate            PROC      NEAR                ;PROC TO LOCATE THE CURSOR
  77.                    PUSH      BP                  ;THE FRAME POINTER
  78.                    MOV       BP,SP               ;POINT TO MOST RECENT STACK ELE
  79.                    MOV       DH,[BP+4]           ;GET THE ROW..
  80.                    MOV       DL,[BP+6]           ;..AND THE COL
  81.                    MOV       BH,0H               ;GRAPHICS PAGE NO.
  82.                    MOV       AH,2H               ;SET_CURSOR_POSITION
  83.                    INT       10H                 ;VIDEO-IO
  84.                    POP       BP                  ;THE FRAME POINTER
  85.                    RET
  86. _locate            ENDP
  87.  
  88. ;-------------------------------------------------------------------------------
  89. ; CURSIZE          (ROUTINE 3)
  90. ;        THIS ROUTINE SETS THE SIZE OF THE CURSOR
  91. ; THE C LANGUAGE CALL IS:
  92. ;        CURSIZE(START_LINE,STOP_LINE);
  93. ; THE ASSEMBLY CALL IS:
  94. ;        MOV    DX,STOP_LINE   ;13 IS NORMAL STOP_LINE FOR MONOCHROME ADAPTOR
  95. ;        PUSH   DX
  96. ;        MOV    DX,START_LINE  ;12 IS NORMAL START_LINE FOR MONOCHROME ADAPTOR
  97. ;        PUSH   DX
  98. ;        CALL   CURSIZE
  99. ;-------------------------------------------------------------------------------
  100.                    PUBLIC    _cursize
  101. _cursize           PROC      NEAR
  102.                    PUSH      BP                  ;THE FRAME POINTER
  103.                    MOV       BP,SP               ;POINT TO MOST RECENT STACK ELE
  104.                    MOV       CH,[BP+4]           ;CURSOR START LINE
  105.                    MOV       CL,[BP+6]           ;CURSOR STOP LINE
  106.                    MOV       AH,1H               ;SET CURSOR TYPE
  107.                    INT       10H                 ;VIDEO-IO
  108.                    POP       BP                  ;THE FRAME POINTER
  109.                    RET
  110. _cursize           ENDP
  111.  
  112. ;-------------------------------------------------------------------------------
  113. ; GET_MODE         (ROUTINE 4)
  114. ;     THIS ROUTINE RETURNS THE CRT MODE IN AL, AND THE NUMBER OF CHARACTER
  115. ;     COLUMNS ON THE SCREEN IN AH
  116. ; THE C LANGUAGE CALL IS: mode_area.value = get_mode();
  117. ;     WHERE mode_area is defined as:
  118. ; union
  119. ;   {
  120. ;    int value;
  121. ;    struct
  122. ;       {è;         char al;           /*al EQ 7 is monochrome*/
  123. ;         char ah;           /*number of character columns on the screen*/
  124. ;       } al_ah;
  125. ;   } mode_area;
  126. ;
  127. ; THE ASSEMBLY CALL IS:
  128. ;      CALL GET_MODE
  129. ;-------------------------------------------------------------------------------
  130.                    PUBLIC      _get_mode
  131. _get_mode          PROC        NEAR
  132.                    PUSH        BP           ;THE FRAME POINTER
  133.                    MOV         AX,0         ;CLEAR THE REG
  134.                    MOV         AH,15        ;GET CURRENT VIDEO MODE
  135.                    INT         10H          ;VIDEO-IO
  136.                    POP         BP           ;THE FRAME POINTER
  137.                    RET
  138. _get_mode          ENDP
  139.  
  140. ;-------------------------------------------------------------------------------
  141. ; SET_VIDEO_ADDRESS (ROUTINE 5)
  142. ;     THIS ROUTINE IS USED IN SEVERAL OF THE OTHER ROUTINES TO TEST THE VIDEO
  143. ;     MODE AND TO SET THE CORRECT VIDEO BUFFER ADDRESS (MONOCHROME OR GRAPHICS).
  144. ;     THE VIDEO BUFFER ADDRESS IS RETURNED IN AX.
  145. ;     THIS IS AN INTERNAL ROUTINE SO THE C LANGUAGE AND ASSEMBLY LANGUAGE
  146. ;     CALLS ARE NOT SHOWN IN THIS PROLOGUE.
  147. ;-------------------------------------------------------------------------------
  148. SET_VIDEO_ADDRESS  PROC      NEAR
  149.                    CALL      _get_mode           ;GET CRT MODE
  150.                    CMP       AL,7H               ;IS IT A MONOCHROME CARD?
  151.                    JNE       ITS_GRAPHICS
  152.                    MOV       AX,MONOCHROME_SEGADR ;MONOCHROME BUFFER SEG ADDR
  153.                    JMP       RETURN
  154. ITS_GRAPHICS:      MOV       AX,GRAPHICS_SEGADR  ;GRAPHICS BUFFER SEG ADR
  155. RETURN:            RET
  156. SET_VIDEO_ADDRESS  ENDP
  157.  
  158. ;-------------------------------------------------------------------------------
  159. ; CALC_VIDEO_OFFSET   (ROUTINE 6)
  160. ;     THIS ROUTINE IS USED BY SEVERAL OF THE ROUTINES TO CALCULATE THE OFFSET
  161. ;     INTO THE VIDEO BUFFER FOR MOVING CHARACTERS INTO OR FROM THE VIDEO BUFFER.
  162. ;     DX MUST BE SET TO THE ROW, AND CX MUST BE SET TO THE COLUMN BEFORE THIS
  163. ;     ROUTINE IS EXECUTED. THE OFFSET IS RETURNED IN AX.
  164. ;     THIS IS AN INTERNAL ROUTINE SO THE C LANGUAGE AND ASSEMBLY LANGUAGE
  165. ;     CALLS ARE NOT SHOWN IN THIS PROLOGUE.
  166. ;-------------------------------------------------------------------------------
  167. CALC_VIDEO_OFFSET PROC      NEAR
  168.                   MOV       AX,NUM_BYTES_IN_ROW ;NUMBER OF BYTES IN ROW
  169.                   MUL       DX                  ;RESULT IS IN AX
  170.                   ADD       AX,CX               ;THE COL
  171.                   SHL       AX,1                ;MULTIPLY BY 2 FOR CHAR/ATTR
  172.                   RET
  173. CALC_VIDEO_OFFSET ENDP
  174.  
  175. ;-------------------------------------------------------------------------------
  176. ; ISRTSTR         (ROUTINE 7)
  177. ;       THIS ROUTINE POSITIONS ITSELF IN THE VIDEO BUFFER, THEN INSERTS A
  178. ;       NULL-TERMINATED STRING, ALONG WITH AN ATTRIBUTE, DIRECTLY INTO THE VIDEO
  179. ;       BUFFER
  180. ; THE C LANGUAGE CALL IS:  ISRTSTR(ROW,COL,STRING,ATTR);
  181. ; THE ASSEMBLY CALL IS:
  182. ;        MOV    DX,ATTRIBUTE   ;THE ATTRIBUTE BYTE (VALUE OF NORMAL IS 7)
  183. ;        PUSH   DX
  184. ;        LEA    DX,STRING      ;GET ADDRESS OF THE STRING
  185. ;        PUSH